﻿using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using nmConnectionDatabase;

namespace nmUsuarios
{
        // ************************************************************
        // --------------------- USUARIOS ---------------------- 
        // ************************************************************

        public class Usuarios
        {

            //Propiedades
            public string IDUsuario { get; set; }
            public string Contraseña { get; set; }
            public string Nombre { get; set; }
            public string Apellido { get; set; }
            public int NivelAcceso { get; set; }
            public bool Activo { get; set; }

            //Metodos
            public void SetPropiedades(string IDUsuario, string Contraseña, string Nombre, string Apellido, int NivelAcceso, bool Activo)
            {
                this.IDUsuario = IDUsuario;
                this.Contraseña = Contraseña;
                this.Nombre = Nombre;
                this.Apellido = Apellido;
                this.NivelAcceso = NivelAcceso;
                this.Activo = Activo;
            }

            public void CatchSQLException(SqlException ex)
            {
                StringBuilder errorMessages = new StringBuilder();
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    errorMessages.Append("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "Procedure: " + ex.Errors[i].Procedure + "\n");
                }

                MessageBox.Show(errorMessages.ToString());
            }

            // ------------------------------------------------------------------------
            // ------- TODOS ESTOS METODOS------------------------------------------
            // ------- SON PARA DAR DE ALTA UN USUARIO --------------------------------
            // ------------------------------------------------------------------------

            //Para dar el Alta de un Usuario, recibe el DataSet y la Ruta de conexion
            //Si hay cambios, llama al metodo private InsertUsuarios, si no hay Indica que no se ha añadido nada


            public void AltaUsuarios(DataSet ds, string Ruta)
            {
                if (ds.HasChanges(DataRowState.Added))
                {
                    DataSet dsInsert = new DataSet();
                    dsInsert = ds.GetChanges(DataRowState.Added);
                    InsertUsuario(dsInsert, Ruta);
                }

                else
                {
                    MessageBox.Show("No se ha insertado ningun Usuario");
                }
            }


            public void AltaUsuarios(string RutaDB, string IDUsuario, string Contraseña, string Nombre, string Apellido, int NivelAcceso, bool Activo)
            {
                try
                {

                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, IDUsuario, Contraseña, Nombre, Apellido, NivelAcceso, Activo);
                    ExecSPUsuarios(RutaDB, "spInsertUsuarios", comando);
                }

                catch (SqlException ex)
                {
                    CatchSQLException(ex);
                }
            }

            //Para Insertar los Usuarios en la DB, recibe el DataSet con los Rows a añadir
            //y arma los parametros para ejecutarlo en la DB. 
            private void InsertUsuario(DataSet dsInsert, string Ruta)
            {
                try
                { //Ingresa al Try para ver si puede Insertar el Usuarios. 
                    int FilasInsertadas = 0;

                    foreach (DataRow fila in dsInsert.Tables[0].Rows)
                    {
                        SqlCommand comando = new SqlCommand();
                        ArmarParametrosInsert(ref comando, fila);
                        ExecSPUsuarios(Ruta, "spInsertUsuarios", comando);
                        FilasInsertadas++;
                        MessageBox.Show("Se Agregaron " + FilasInsertadas + " Usuarios Nuevos");
                    }

                }

                catch (SqlException ex)
                {

                    StringBuilder errorMessages = new StringBuilder();
                    for (int i = 0; i < ex.Errors.Count; i++)
                    {
                        errorMessages.Append("Index #" + i + "\n" +
                            "Message: " + ex.Errors[i].Message + "\n" +
                            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                            "Source: " + ex.Errors[i].Source + "\n" +
                            "Procedure: " + ex.Errors[i].Procedure + "\n");
                    }

                    MessageBox.Show(errorMessages.ToString());

                }

            }

            private void ArmarParametrosInsert(ref SqlCommand comando, string IDUsuario, string Contraseña, string Nombre, string Apellido, int NivelAcceso, bool Activo)
            {
                //Primer Parametro
                SqlParameter SqlParametros = new SqlParameter();
                SqlParametros = comando.Parameters.Add("@IDUsuario", SqlDbType.NVarChar, 50);
                SqlParametros.Value = IDUsuario;
                //Segundo Parametro
                SqlParametros = comando.Parameters.Add("@Contraseña", SqlDbType.NVarChar, 50);
                SqlParametros.Value = Contraseña;
                // Tercer Parametro
                SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 50);
                SqlParametros.Value = Nombre;
                // Cuarto Parametro
                SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
                SqlParametros.Value = Apellido;
                //Quinto Parametro
                SqlParametros = comando.Parameters.Add("@NivelAcceso", SqlDbType.Int);
                SqlParametros.Value = NivelAcceso;
                //Sexto Parametro
                SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.Bit);
                SqlParametros.Value = Activo;
            }

            public void AltaUsuarios(string RutaDB, Usuarios User)
            {
                try
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, User);
                    ExecSPUsuarios(RutaDB, "spInsertUsuarios", comando);
                }

                catch (SqlException ex)
                {
                    CatchSQLException(ex);
                }

            }

            //Ejecuta el SPInsertUsuario de la DB
            private int ExecSPUsuario(String RutaBD, String NombreSP, SqlCommand Comando)
            {
                try
                {
                    SqlConnection Conexion = new SqlConnection(RutaBD);
                    Conexion.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd = Comando;
                    cmd.Connection = Conexion;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = NombreSP;
                    cmd.ExecuteNonQuery();
                    Conexion.Close();
                    return 0;
                }

                catch (SqlException ex)
                {
                    CatchSQLException(ex);
                    return 1;
                }
            }

            //Ejecuta el SPInsertUsuarios de la DB
            private void ExecSPUsuarios(String RutaBD, String NombreSP, SqlCommand Comando)
            {
                try
                {
                    SqlConnection Conexion = new SqlConnection(RutaBD);
                    Conexion.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd = Comando;
                    cmd.Connection = Conexion;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = NombreSP;
                    cmd.ExecuteNonQuery();
                    Conexion.Close();
                }

                catch (SqlException ex)
                {

                    StringBuilder errorMessages = new StringBuilder();
                    for (int i = 0; i < ex.Errors.Count; i++)
                    {
                        errorMessages.Append("Index #" + i + "\n" +
                            "Message: " + ex.Errors[i].Message + "\n" +
                            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                            "Source: " + ex.Errors[i].Source + "\n" +
                            "Procedure: " + ex.Errors[i].Procedure + "\n");
                    }

                    MessageBox.Show(errorMessages.ToString());
                }
            }


            //Arma los Parametros de todas las variables y columnas para poder pasarlo a la DB
            private void ArmarParametrosInsert(ref SqlCommand comando, DataRow fila)
            {
                //Primer Parametro
                SqlParameter SqlParametros = new SqlParameter();
                SqlParametros = comando.Parameters.Add("@IDUsuario", SqlDbType.NVarChar, 50);
                SqlParametros.Value = fila["IDUsuario"];

                //Segundo Parametro
                SqlParametros = comando.Parameters.Add("@Contraseña", SqlDbType.NVarChar, 50);
                SqlParametros.Value = fila["Contraseña"];

                // Tercer Parametro
                SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 50);
                SqlParametros.Value = fila["Nombre"];

                // Cuarto Parametro
                SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
                SqlParametros.Value = fila["Apellido"];

                //Quinto Parametro
                SqlParametros = comando.Parameters.Add("@NivelAcceso", SqlDbType.Int);
                SqlParametros.Value = fila["NivelAcceso"];

                //Sexto Parametro
                SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.Bit);
                SqlParametros.Value = fila["Activo"];
            }

            //Arma los Parametros de todas las variables y columnas para poder pasarlo a la DB
            private void ArmarParametrosInsert(ref SqlCommand comando, Usuarios User)
            {
                //Primer Parametro
                SqlParameter SqlParametros = new SqlParameter();
                SqlParametros = comando.Parameters.Add("@IDUsuario", SqlDbType.NVarChar, 50);
                SqlParametros.Value = User.IDUsuario;

                //Segundo Parametro
                SqlParametros = comando.Parameters.Add("@Contraseña", SqlDbType.NVarChar, 50);
                SqlParametros.Value = User.Contraseña;
                // Tercer Parametro
                SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
                SqlParametros.Value = User.Nombre;
                // Cuarto Parametro
                SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
                SqlParametros.Value = User.Apellido;
                //Quinto Parametro
                SqlParametros = comando.Parameters.Add("@NivelAcceso", SqlDbType.Int);
                SqlParametros.Value = User.NivelAcceso;
                //Sexto Parametro
                SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.Int);
                SqlParametros.Value = User.Activo;
            }


            // ------------------------------------------------------------------------
            // ------------------------------------------------------------------------
            // ------------------ESTOS METODOS DE USUARIO-----------------------------------
            // -----------------SON PARA ELIMINAR USUARIOS----------------------------
            // ------------------------------------------------------------------------
            // ------------------------------------------------------------------------

            public void BajaUsuario(string Ruta, string IDUsuario)
            {
                try
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosDelete(ref comando, IDUsuario);
                    ExecSPUsuarios(Ruta, "spLogicUsuarios", comando);
                }

                catch (SqlException ex)
                {

                    StringBuilder errorMessages = new StringBuilder();
                    for (int i = 0; i < ex.Errors.Count; i++)
                    {
                        errorMessages.Append("Index #" + i + "\n" +
                            "Message: " + ex.Errors[i].Message + "\n" +
                            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                            "Source: " + ex.Errors[i].Source + "\n" +
                            "Procedure: " + ex.Errors[i].Procedure + "\n");
                    }

                    MessageBox.Show(errorMessages.ToString());
                }

            }

            private void ArmarParametrosDelete(ref SqlCommand comando, string IDUsuario)
            {
                SqlParameter SqlParametros = new SqlParameter();

                //Primer Parametro
                SqlParametros = comando.Parameters.Add("@IDUsuario", SqlDbType.NVarChar, 50);
                SqlParametros.Value = IDUsuario;
            }

            public void BajaUsuarios(DataSet ds, string Ruta)
            {

                if (ds.HasChanges(DataRowState.Deleted))
                {
                    DataSet dsEliminar = new DataSet();
                    dsEliminar = ds.GetChanges(DataRowState.Deleted);
                    DeleteUsuarios(Ruta, "Usuarios", dsEliminar);
                }

            }

            private void DeleteUsuarios(String RutaBD, String NombreTabla, DataSet ds)
            {
                int FilasEliminadas = 0;
                foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
                {
                    SqlCommand Comando = new SqlCommand();
                    fila.RejectChanges();
                    ArmarParametrosDelete(ref Comando, fila);
                    ExecSPUsuarios(RutaBD, "spLogicUsuarios", Comando);
                    FilasEliminadas++;

                    MessageBox.Show("Se eliminaron: " + FilasEliminadas + " Usuarios.");
                }
            }

            private void ArmarParametrosDelete(ref SqlCommand comando, DataRow fila)
            {
                SqlParameter SqlParametros = new SqlParameter();

                //Primer Parametro
                SqlParametros = comando.Parameters.Add("@IDUsuario", SqlDbType.NVarChar, 50);
                SqlParametros.Value = fila["IDUsuario"];
            }

            // ------------------------------------------------------------------------
            // ------------------------------------------------------------------------
            // ------------------ESTOS METODOS DE USUARIO-----------------------------------
            // -----------------SON PARA UPDATE DE USUARIOS----------------------------
            // ------------------------------------------------------------------------
            // ------------------------------------------------------------------------

            public void ModificarUsuario(DataSet ds, string Ruta)
            {
                if (ds.HasChanges(DataRowState.Modified))
                {
                    DataSet dsUpdate = new DataSet();
                    dsUpdate = ds.GetChanges(DataRowState.Modified);
                    UpdateUsuarios(dsUpdate, Ruta);
                }
            }

            private void UpdateUsuarios(DataSet dsInsert, string Ruta)
            {
                try
                { //Ingresa al Try para ver si puede Insertar el Usuario. 
                    int FilasInsertadas = 0;

                    foreach (DataRow fila in dsInsert.Tables[0].Rows)
                    {
                        SqlCommand comando = new SqlCommand();
                        ArmarParametrosInsert(ref comando, fila);
                        ExecSPUsuarios(Ruta, "spUpdateUsuarios", comando);
                        FilasInsertadas++;
                        MessageBox.Show("Se Modificaron " + FilasInsertadas + " Usuarios Nuevos");
                    }

                }

                catch (SqlException ex)
                {

                    StringBuilder errorMessages = new StringBuilder();
                    for (int i = 0; i < ex.Errors.Count; i++)
                    {
                        errorMessages.Append("Index #" + i + "\n" +
                            "Message: " + ex.Errors[i].Message + "\n" +
                            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                            "Source: " + ex.Errors[i].Source + "\n" +
                            "Procedure: " + ex.Errors[i].Procedure + "\n");
                    }

                    MessageBox.Show(errorMessages.ToString());
                }

            }

            public void ModificarUsuario(string RutaDB, Usuarios User)
            {
                try
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, User);
                    int error = ExecSPUsuario(RutaDB, "spUpdateUsuarios", comando);
                }

                catch (SqlException ex)
                {
                    CatchSQLException(ex);
                    MessageBox.Show("Error al Insertar");

                }

            }

        }



}
